package fiuba.algo3.algoThieft.modelo;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.w3c.dom.Element;
import org.w3c.dom.Node;

public class Ladron implements Malviviente {
	private String nombre;
	private Caracteristica sexo,hobby,cabello,senia,vehiculo;
	
	public Ladron (String nombre,String sexo,String hobby,
				   String cabello,String senia,String vehiculo) throws ErrorValorNoValido {
		this.nombre = nombre;
		this.sexo = new Caracteristica( "sexo" , sexo );
		this.hobby = new Caracteristica( "hobby" , hobby );
		this.cabello = new Caracteristica( "cabello" , cabello );
		this.senia = new Caracteristica( "senia" , senia );
		this.vehiculo = new Caracteristica( "vehiculo" , vehiculo );
	}
	
	public static Ladron crearLadron (Node nodoXML ) throws ErrorValorNoValido {
		
		String nombre = ( (Element) nodoXML).getAttribute("nombre");
		String sexo =  ( (Element) nodoXML).getAttribute("sexo") ;
		String hobby = ( (Element) nodoXML).getAttribute("hobby") ;
		String cabello = ( (Element) nodoXML).getAttribute("cabello");
		String senia = ( (Element) nodoXML).getAttribute("senia") ;
		String vehiculo = ( (Element) nodoXML).getAttribute("vehiculo") ;
		
		return new Ladron (nombre,sexo,hobby,cabello,senia,vehiculo);
	}
	
	public String getNombre() {
		return this.nombre;
	}
	
	public String getSexo (){
		return this.sexo.getValor();
	}
	
	public List<Capital> implementarEstrategiaDeEscape (ObjetoRobado objetoRobado) {
		
		List<Capital> listaResultado = new ArrayList<Capital>();
	    Capital capitalActual = objetoRobado.getUbicacionInicial();
	    listaResultado.add(capitalActual);
	    int tamanioListaResultado = objetoRobado.getCantidadDeCiudadesNecesariasParaEsconderlo(); 
	    
	    List<Caracteristica> caracteristicas = this.obtenerListaConCaracteristicas();
	    
	    while (listaResultado.size() <= tamanioListaResultado){
            Capital capitalAnterior = capitalActual;
	    	List<Capital> posiblesCapitales = capitalActual.getCapitalesAdyacentes();
            capitalActual = posiblesCapitales.get(1);
            
            capitalAnterior.ladronViajaA(capitalActual);
            
            capitalActual.guardarCaracteristicas (caracteristicas);
            
            listaResultado.add(capitalActual);
	    }
	    capitalActual.esconder(this);
	    
	    return listaResultado;
	}
	
	private List<Caracteristica> obtenerListaConCaracteristicas () {
		List<Caracteristica> lista = new ArrayList<Caracteristica>(Arrays.asList(hobby,cabello,senia,vehiculo));
		Collections.shuffle(lista);
		return lista;
	}
	
	public boolean tieneCaracteristicas (String sexo, String hobby, String cabello, 
			 String senia, String vehiculo){
		
		List<String> caracteristicasRecibidas = Arrays.asList(sexo,hobby,cabello,senia,vehiculo);	
		return this.compararListasConCaracteristicas(caracteristicasRecibidas);	
	}
	
	private boolean compararListasConCaracteristicas (List<String> caracteristicas){
		List<Caracteristica> caracteristicasLadron = Arrays.asList(this.sexo , this.hobby , this.cabello ,
				   										   this.senia , this.vehiculo);
		boolean coinciden = true;
		for (int i = 0; i < caracteristicasLadron.size() && coinciden; i++){
			String caracteristicaLadron = caracteristicasLadron.get(i).getValor();
			String caracteristicaAComparar = caracteristicas.get(i).toLowerCase();
			
			if (caracteristicaAComparar.length()>0){
				coinciden = caracteristicaLadron.equals(caracteristicaAComparar);
			}
		}
		return coinciden;
	}
	
	@Override
	public Pista rastroAlEsconderse() {
		
		return new PistaAcaEsta() ;
	}
	@Override
	public void interactuarConVisitante(Juego juego) {
		juego.interactuarConResidente(this);
		
	}
}